; SPDX-License-Identifier: GPL-3.0-only
;
; Copyright (c) 2008-2023 100askTeam : Dongshan WEI <weidongshan@qq.com> 
; Discourse:  https://forums.100ask.net
;
;  Copyright (C) 2008-2023 深圳百问网科技有限公司
;  All rights reserved
;
; 免责声明: 百问网编写的文档, 仅供学员学习使用, 可以转发或引用(请保留作者信息),禁止用于商业用途！
; 免责声明: 百问网编写的程序, 可以用于商业用途, 但百问网不承担任何后果！
; 
; 本程序遵循GPL V3协议, 请遵循协议
; 百问网学习平台   : https://www.100ask.net
; 百问网交流社区   : https://forums.100ask.net
; 百问网官方B站    : https://space.bilibili.com/275908810
; 百问网官方淘宝   : https://100ask.taobao.com
; 联系我们(E-mail): weidongshan@qq.com
;
;          版权所有，盗版必究。
;  
; 修改历史     版本号           作者        修改内容
;-----------------------------------------------------
; 2024.09.20      v01         百问科技      创建文件
;-----------------------------------------------------
;
; 本程序定义了HardFault_Handler函数
; 你的工程里可能也定义了这个函数
; 把你工程里的HardFault_Handler函数注释掉即可
;
;
                PRESERVE8
                THUMB
                AREA    |.text|, CODE, READONLY

    IMPORT DumpCore
    EXPORT HardFault_Handler
HardFault_Handler    PROC

    ; 栈帧保存在MSP还是PSP?
    TST     lr, #0x04         ; if(!EXC_RETURN[2]) // 看看LR寄存器的BIT2是否为0
    MRSEQ   r0, msp           ; [2]=0 ==> 为0则使用MSP
    MRSNE   r0, psp           ; [2]=1 ==> 为1则使用PSP

    STMFD   r0!, {r4 - r11}   ; 软件保存r4 - r11
    STMFD   r0!, {lr}         ; 把LR即exec_return也保存起来

    TST     lr, #0x04         ; if(!EXC_RETURN[2]) // 看看LR寄存器的BIT2是否为0
    MSREQ   msp, r0           ; [2]=0 ==> 更新MSP, 下面要恢复MSP

    PUSH    {lr}
    BL      DumpCore
    POP     {lr}
    
    TST     lr, #0x04         ; if(!EXC_RETURN[2]) // 看看LR寄存器的BIT2是否为0
    POPEQ {lr}                ; 恢复MSP
    POPEQ {r4 - r11}          ; 恢复MSP

    BX      lr
    ENDP
        
    END
